﻿using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using Entidades;
using Excepciones;
using DAO;
using LisBioGUIWPF.util;
using Negocio;
using LisBioGUIWPF.GuiFunctions;

namespace LisBioGUIWPF.Controls.Project
{
    [LisBioException]
    public partial class ProjectData : UserControl
    {
        
        private LisBio lisBio;
        private List<EntidadPerfil> perfiles = new List<EntidadPerfil>();
        
        public enum Operacion
        { 
            NUEVO, ELIMINAR, MODIFICAR, DETALLES
        }

        private Operacion operacion;
        private ReglaBase.Operacion operRegla;
        private EntidadProyecto project;
        private ProyectoControl projectControl;

        public ProjectData(LisBio lisBio, Operacion operacion, ProyectoControl projectControl)
        {
            InitializeComponent();
            this.lisBio = lisBio;
            this.operacion = operacion;

            this.Loaded += new RoutedEventHandler(ProjectData_Loaded);
            this.projectControl = projectControl;

            switch (operacion)
            {
                case Operacion.NUEVO:
                    this.tabDatos.Header = "Nuevo Proyecto";
                    this.operRegla = ReglaBase.Operacion.INSERT; break;
                case Operacion.MODIFICAR:
                    this.tabDatos.Header = "Modificar Proyecto";
                    this.operRegla = ReglaBase.Operacion.UPDATE; break;
                case Operacion.ELIMINAR:
                    this.tabDatos.Header = "Eliminar Proyecto";
                    this.btnGuardar.Content = "Eliminar";
                    this.bloquear();
                    this.operRegla = ReglaBase.Operacion.DELETE; break;
                case Operacion.DETALLES:
                    this.tabDatos.Header = "Detalles Proyecto";
                    this.btnGuardar.Content = "Cerrar";
                    this.btnAgregar.Visibility = Visibility.Hidden;
                    this.btnModificar.Visibility = Visibility.Hidden;
                    this.btnEliminar.Visibility = Visibility.Hidden;
                    this.btnCancel.Visibility = Visibility.Hidden;
                    this.bloquear();
                    break;
            }

            this.listarInvestigadores();
            this.Loaded += new RoutedEventHandler(ProjectData_Loaded);
        }

        void ProjectData_Loaded(object sender, RoutedEventArgs e)
        {
            this.txtNombre.Focus();
        }

        private void btnCancel_Click(object sender, RoutedEventArgs e)
        {
            ImageControl image = new ImageControl(this.lisBio);
            image.setDefaultImage();
            this.lisBio.borderControles.Child.IsEnabled = true;
            this.lisBio.borderHuella.Child = image;

            CargarComponente.cargarProyectosCombo(this.projectControl.comboBuscar);
        }

        private bool checkData()
        {
            if (txtNombre.Text.Length > 0 && txtDescripcion.Text.Length > 0 )
            {
                return true;
            }

            return false;
        }

        private void btnGuardar_Click(object sender, RoutedEventArgs e)
        {
            if (!this.checkData())
            {
                this.tabControl.SelectedItem = tabDatos;
                MessageBox.Show("Faltan completar algunos Datos.", "Datos Incorrectos");
            }
            else if (this.operacion == Operacion.DETALLES)
            {
                ImageControl image = new ImageControl(this.lisBio);
                image.setDefaultImage();
                this.lisBio.borderHuella.Child = image;
            }
            else
            {

                DateTime? fechaI = this.datePicker1.SelectedDate;
                DateTime? fechaF = this.datePicker2.SelectedDate;

                EntidadInvestigador investigadorLider = new EntidadInvestigador();
                if (comboLider.SelectedItem != null)
                {
                    investigadorLider = (EntidadInvestigador)comboLider.SelectedItem;
                }
                else
                {
                    investigadorLider = null;
                }

                int duracion = 0;
                try
                {
                    duracion = int.Parse(txtDuracion.Text);
                }
                catch (Exception exc) { }

                EntidadProyecto proyecto = new EntidadProyecto(txtNombre.Text, txtDescripcion.Text, txtWeb.Text,
                    txtMail.Text, fechaI, fechaF, duracion, investigadorLider, this.perfiles);

                //Seteando el id del proyecto al que se van a actualizar los datos, los demas datos se obtuvieron del formulario
                if (project != null)
                {
                    proyecto.Id = project.Id;
                }

                ProyectoDAO proyectoDAO = new ProyectoDAO();
                ReglaBase regla = new ReglaBase(proyecto, proyectoDAO, this.operRegla);

                try
                {
                    int id = regla.execute();
                    if(id != 0) proyecto.Id = id;

                    if (this.operRegla != ReglaBase.Operacion.DELETE)
                    {
                        foreach (EntidadPerfil perfil in this.perfiles)
                        {
                            PerfilDAO perfilDAO = new PerfilDAO();
                            perfil.Proyecto = proyecto;
                            ReglaBase reglaPerfil = new ReglaBase(perfil, perfilDAO, ReglaBase.Operacion.INSERT);
                            reglaPerfil.execute();
                        }
                    }

                    switch (operacion)
                    {
                        case Operacion.NUEVO:
                            this.lisBio.notification("Proyecto Guardado");
                            break;
                        case Operacion.MODIFICAR:
                            this.lisBio.notification("Proyecto Modificado");
                            break;
                        case Operacion.ELIMINAR:
                            this.lisBio.notification("Proyecto Eliminado");
                            break;
                    }

                    this.lisBio.cargarMenuProyectos();

                    this.btnCancel_Click(sender, e);
                }
                catch (InvalidEntityException exc)
                {
                    MessageBox.Show("Los Datos del Proyecto no se han podido guardar.\n" +
                    "Puede que los datos no sean correctos.\nPor favor intentelo nuevamente...", "Datos Proyecto");
                }
                catch (Exception exception)
                {
                    MessageBox.Show("Se ha producido el siguiente error:\n" + exception.Message, "Error!");

                    MessageBoxResult result = MessageBox.Show("Desea reportar el error?", "Error Desconocido", MessageBoxButton.YesNo);

                    if (result == MessageBoxResult.Yes)
                    {
                        ReportBugs reportar = new ReportBugs();
                        reportar.Show();
                    }
                }
            }
        }

        private void bloquear()
        {
            this.txtNombre.IsReadOnly = true;
            this.txtDescripcion.IsReadOnly = true;
            this.txtWeb.IsReadOnly = true;
            this.txtMail.IsReadOnly = true;
            this.datePicker1.IsEnabled = false;
            this.datePicker2.IsEnabled = false;
            this.txtDuracion.IsReadOnly = true;
            this.comboLider.IsEnabled = false;

            this.txtProyCantidad.IsReadOnly = true;
            this.txtProyConocimientos.IsReadOnly = true;
            this.txtProyDescripcion.IsReadOnly = true;
            this.txtProyNombre.IsReadOnly = true;
            this.txtProyTecnologias.IsReadOnly = true;
            this.btnEliminar.IsEnabled = false;
            this.btnModificar.IsEnabled = false;
            this.btnAgregar.IsEnabled = false;
        }

        public EntidadProyecto Project
        {
            get { return this.project; }
            set { this.project = value; }
        }

        public void cargarDatos()
        {
            //Tab Investigador
            this.txtDescripcion.Text = this.project.Descripcion;
            this.txtDuracion.Text = ""+this.project.TiempoEstimadoMeses;
            this.txtMail.Text = this.project.Mail;
            this.txtNombre.Text = this.project.Nombre;
            this.txtWeb.Text = this.project.SitioWeb;
            this.datePicker1.SelectedDate = this.project.FechaInicio;
            this.datePicker2.SelectedDate = this.project.FechaFin;
            this.comboLider.SelectedValue = this.project.InvestigadorLider.Id;

            PerfilDAO perfilDao = new PerfilDAO();
            List<EntidadBase> lista = perfilDao.searchByProject(this.project);

            if (lista != null)
            {
                foreach (EntidadBase entidad in lista)
                {
                    this.perfiles.Add((EntidadPerfil)entidad);
                    this.List.Items.Add((EntidadPerfil)entidad);
                }
            }
        }

        private void comboLider_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
        {

            if ( e.Key != System.Windows.Input.Key.Escape &&
                e.Key != System.Windows.Input.Key.Down &&
                e.Key != System.Windows.Input.Key.Up &&
                e.Key != System.Windows.Input.Key.Left &&
                e.Key != System.Windows.Input.Key.Right &&
                e.Key != System.Windows.Input.Key.Enter)
            {

                this.comboLider.IsDropDownOpen = true;

                //COLOCAR EN LUGAR DE NULL LA LISTA QUE SE VA A FILTRAR
                //Util.FilterCombo(this.comboLider, null);
            }
        }

        public void listarInvestigadores()
        {
            comboLider.Items.Clear();

            List<EntidadBase> entidades = new List<EntidadBase>();
            InvestigadorDAO daoInvestigador = new InvestigadorDAO();

            entidades = daoInvestigador.leerTodas();
            for (int i = 0; i < entidades.Count; i++)
            {
                EntidadInvestigador investigador;
                investigador = (EntidadInvestigador)entidades[i];
                if (!(bool)investigador.EsEncargado)
                {
                    comboLider.Items.Add(investigador);
                }
            }
            comboLider.DisplayMemberPath = "NombreYApellido";
            comboLider.SelectedValuePath = "Id";
        }

        private void btnAgregar_Click(object sender, RoutedEventArgs e)
        {
            if (this.integridadPerfil())
            {
                int cantidad = 0;
                try
                {
                    cantidad = int.Parse(txtProyCantidad.Text);
                }
                catch (Exception exc)
                {
                    MessageBox.Show("La cantidad ingresada no es un Numero Correcto", "Cantidad Incorrecta");
                }

                EntidadPerfil perfil = new EntidadPerfil(txtProyNombre.Text, txtProyDescripcion.Text,
                    txtProyTecnologias.Text, txtProyConocimientos.Text, cantidad, null, this.project, true);

                if (sender == this.btnModificar)
                {
                    int pos = this.List.SelectedIndex;
                    this.perfiles.Insert(pos, perfil);
                    this.List.Items.Insert(pos, perfil);
                    this.List.Items.RemoveAt(pos+1);
                    this.perfiles.RemoveAt(pos+1);
                    this.lblModificar.Visibility = Visibility.Hidden;
                }
                else
                {
                    this.perfiles.Add(perfil);

                    this.List.Items.Add(perfil);
                }

                this.limpiarDatosPerfil();
            }
            else
            {
                MessageBox.Show("Debe Completar como minimo el Nombre y la Descripcion", "Perfil Incorrecto");
            }
        }

        private bool integridadPerfil()
        {
            if (txtProyNombre.Text != "" &&
                txtProyDescripcion.Text != "")
            {
                return true;
            }

            return false;
        }

        private void limpiarDatosPerfil()
        {
            txtProyCantidad.Text = "0";
            txtProyConocimientos.Text = "";
            txtProyDescripcion.Text = "";
            txtProyNombre.Text = "";
            txtProyTecnologias.Text = "";
        }

        private void seleccionarPerfil_Click(object sender, SelectionChangedEventArgs e)
        {
            if (this.List.SelectedIndex > -1)
            {
                EntidadPerfil perfil = (EntidadPerfil)this.List.SelectedItem;

                txtProyCantidad.Text = "" + perfil.Cantidad;
                txtProyConocimientos.Text = perfil.Conocimientos;
                txtProyDescripcion.Text = perfil.Descripcion;
                txtProyNombre.Text = perfil.Nombre;
                txtProyTecnologias.Text = perfil.Tecnologia;

                this.lblModificar.Visibility = Visibility.Visible;
            }
        }

        private void btnEliminar_Click(object sender, RoutedEventArgs e)
        {
            int pos = this.List.SelectedIndex;
            if (pos > -1)
            {
                this.perfiles.RemoveAt(pos);
                this.List.Items.RemoveAt(pos);

                txtProyCantidad.Text = "0";
                txtProyConocimientos.Text = "";
                txtProyDescripcion.Text = "";
                txtProyNombre.Text = "";
                txtProyTecnologias.Text = "";
            }
            else
            {
                MessageBox.Show("Debe seleccionar un perfil a eliminar", "Perfil Seleccionado Incorrecto");
            }
        }

    }
}
